COLUMN

AI IVRの最前線!Amazon Connect × Lex × Bedrockで実現する最新システムを構築してみた

こんにちは、佐藤です。

みなさん、AI IVRを知っていますか?

AI IVR(Interactive Voice Response)とは、人工知能を活用した自動音声応答システムのことです。音声認識と自然言語処理を用いて、顧客の問い合わせに自動で対応してくれるので、カスタマーサポートの効率化とユーザー体験の向上が図れます。

今回は、Amazon ConnectとAmazon LexとAmazon Bedrockを利用して、AI IVRを実際に構築してみたのでご紹介します。

NTT東日本ではAI IVRソリューションをご提供しております。詳細はこちらのページで紹介しておりますので、併せてご覧いただければと思います。

1. Amazon Bedrockとは?

Amazon BedrockはAWSが提供するフルマネージド型の生成AIサービスです。

Amazon Bedrockを利用することで、AI技術を使って文章を生成したり、画像を作ったり、データから新しい情報を生み出したりすることができます。

また、難しい技術的な知識がなくても、簡単にAIを使ったアプリケーションを作ることができるのが特徴です。

Amazon Bedrockの詳しい内容については、こちらの記事をご確認ください。

生成AIサービス「Amazon Bedrock」とは?できること・使い方

NTT東日本のクラウドエンジニアにてAmazon Connectの導入運用支援を実施しております。サービス資料をダウンロードして、自社の電話業務の改善にお役立てください。

2. Amazon Lexとは?

Amazon LexはAWSが提供する音声やテキストを使用して、任意のアプリケーションに対話型インターフェイスを構築するサービスです。

Amazon Lexには、音声からテキストデータへの変換に自動音声認識(ASR)、テキストの認識には自然言語理解(NLU)と呼ばれるディープラーニング技術が活用されており、Amazon Alexaに使われているものと同じ技術を使用できます。

Amazon Lexの詳しい内容については、こちらの記事をご確認ください。

ディープラーニングを利用した対話型アプリを構築できるAmazon Lexを解説

NTT東日本のクラウドエンジニアにてAmazon Connectの導入運用支援を実施しております。サービス資料をダウンロードして、自社の電話業務の改善にお役立てください。

3. Amazon Connectとは?

Amazon ConnectとはAWSが提供するクラウド型コンタクトセンターサービスです。

AIを活用した音声認識や自然言語処理機能も統合されており、効率的なカスタマーサポートを実現します。

また、従量課金で使用することができ、コンタクトセンターの運用を簡素化+オペレーターの効率を向上させ、コスト削減を行うことができます。

Amazon Connectの詳しい内容については、こちらの記事をご確認ください。

AmazonConnectとは|導入時のメリット・注意点を解説

NTT東日本のクラウドエンジニアにてAmazon Connectの導入運用支援を実施しております。サービス資料をダウンロードして、自社の電話業務の改善にお役立てください。

4. AI IVRシステムの構築

今回構築するシステムの構成図としては、以下の通りです。

Amazon ConnectのコンタクトフローからAmazon Lexで質問を受け取り、Amazon Lexでテキスト化された質問内容をLambdaがAmazon Bedrockにリクエストする流れとなります。

NTT東日本では上記仕組みを応用し、AI IVRソリューションをご提供しております。詳細はこちらのページをご覧ください。

4-1. AI IVRシステムを構築するための前提条件

今回は、Amazon Bedrockで使用するモデルとしてClaude Instantを採用しました。

Amazon BedrockでClaude Instantを使用する手順についてはこちらの記事をご確認ください。

【AWS】Amazon Bedrock で Claude 3 を利用したチャットを使ってみた

次に、Lambda関数からAmazon BedrockのAPIを呼び出すために必要なアクセス権限を定義したIAMロールを作成します。

アクセス権限のポリシー定義は以下で作成します。

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Action": "bedrock:*",
     "Resource": "*"
   }
 ]
}

信頼関係のポリシー定義は以下のようになります。

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Action": [
       "sts:AssumeRole"
     ],
     "Principal": {
       "Service": [
         "lambda.amazonaws.com"
       ]
     }
   }
 ]
}

IAMポリシーの作成方法についてはこちらの記事をご確認ください。

AWSのサービスへのアクセス制御を定義できるAWS IAMのポリシーとは?実際に使用してみた

最後に、Amazon Connectインスタンスをオレゴンリージョンで構築し、電話番号を取得します。

Amazon Connectを構築する手順についてはこちらの記事をご確認ください。

新入社員が入社半年でAmazon Connect構築してみた!!!

4-2. Lambdaの作成

初めにAmazon Lexから呼び出され、Bedrock APIに対してリクエストを送るLambdaを作成します。以下のパラメータを指定してLambda関数を作成します。

  • 関数名:bedrock-lambda
  • ランタイム情報:Python 3.12
  • アーキテクチャ情報:x86_64
  • アクセス権限情報

    • 実行ロール:先ほど作成したIAMロールを指定

Bedrock APIを呼び出すPythonコードは下記の通りに記述を行い、Deproyをクリックします。

import json
import boto3
from decimal import Decimal
bedrock_runtime = boto3.client('bedrock-runtime')

def decimal_to_int(obj):
    if isinstance(obj, Decimal):
        return int(obj)

def elicit_slot(slot_to_elicit, intent_name, slots):
    return {
        'sessionState': {
            'dialogAction': {
                'type': 'ElicitSlot',
                'slotToElicit': slot_to_elicit,
            },
            'intent': {
                'name': intent_name,
                'slots': slots,
                'state': 'InProgress'
            }
        }
    }

def confirm_intent(message_content, intent_name, slots):
    return {
        'messages': [{'contentType': 'PlainText', 'content': message_content}],
        'sessionState': {
            'dialogAction': {
                'type': 'ConfirmIntent',
            },
            'intent': {
                'name': intent_name,
                'slots': slots,
                'state': 'Fulfilled'
            }
        }
    }

def close(fulfillment_state, message_content, intent_name, slots):
    return {
        'messages': [{'contentType': 'PlainText', 'content': message_content}],
        "sessionState": {
            'dialogAction': {
                'type': 'Close',
            },
            'intent': {
                'name': intent_name,
                'slots': slots,
                'state': fulfillment_state
            }
        }
    }

def get_bedrock_response(input_text):
    prompt = f'\n\nHuman: 200字以内で答えてください。答える際、200字以内と言わなくてよいです。{input_text}\n\nAssistant:'

    modelId = 'anthropic.claude-instant-v1' 
    accept = 'application/json'
    contentType = 'application/json'

    body = json.dumps({
        "prompt": prompt,
        "max_tokens_to_sample": 1000
    })

    response = bedrock_runtime.invoke_model(
    	modelId=modelId,
    	accept=accept,
    	contentType=contentType,
        body=body
    )

    response_body = json.loads(response.get('body').read())
    
    return response_body.get('completion')

def Bedrock_intent(event):
    print("Received event:" + json.dumps(event, default=decimal_to_int, ensure_ascii=False))
    intent_name = event['sessionState']['intent']['name']
    slots = event['sessionState']['intent']['slots']
    input_text = event['inputTranscript']

    if slots['freeinput'] is None:
        return elicit_slot('freeinput', intent_name, slots)

    confirmation_status = event['sessionState']['intent']['confirmationState']

    if confirmation_status == "Confirmed":
        return close("Fulfilled", 'それでは、電話を切ります', intent_name, slots)

    elif confirmation_status == "Denied":
        return close("Failed", 'お力になれず、申し訳ありません。電話を切ります', intent_name, slots)

    # confirmation_status == "None"
    response_text = get_bedrock_response(input_text)
    print("Received response_text:" + response_text)

    return confirm_intent(
        f'それでは、回答します。{response_text}。以上が回答になります。回答に納得したかたは、はい、とお伝え下さい。納得いかない場合、いいえ、とお伝え下さい',
        intent_name, slots)

def lambda_handler(event, context):
    print("Received event:" + json.dumps(event, default=decimal_to_int, ensure_ascii=False))

    intent_name = event['sessionState']['intent']['name']

    if intent_name == 'bedrock':
        return Bedrock_intent(event)

lamdaの作成は以上となります。

4-3. Amazon Lexの構築

次に作成したLambdaとAmazon Connectを仲介するLexボットを作成します。

対応言語は日本語で完了をクリックします。

左側にある「インテントリストに戻る」をクリックし、「エイリアス」→対象のエイリアス→『言語:Japanese(Japan)』を順にクリックして、Lambdaの紐付け設定画面を出し、先ほど作成したLambdaを紐づけます。

「インテント」→「NewIntent」をクリックします。

インテントを呼び出すためのサンプル発話は、「はい」にします。

「スロットを追加」をクリックし、スロットを追加画面からスロットタイプを「AMAZON.FreeFormInput」で指定し、追加します。

先程設定したLambdaが利用されるように、「初期化と検証にLambda関数を使用」にチェックをして、保存をします。

右上にある「Build」をクリックし、正常に構築されたことを確認します。

4-4. Amazon Connectのコンタクトフローの作成

作成済のAmazon Connectインスタンスで、「問い合わせフロー」をクリックし、先ほど作成したLexを追加します。

対象インスタンスのインスタンスエイリアスをクリックし、「Log in for emergency access」をクリックします。

左側ルーティングにあるフローをクリックし、「フローを作成」をクリックします。

左側のブロックから下記のようにフローを配置します。

「音声の設定」ブロックの3点リーダーから「設定を編集」をクリックし、「言語」を「日本語」にして「音声」は「Kazuha」にし、「言語属性を設定」にチェックして保存します。

「顧客の入力を取得する」ブロックの3点リーダーから「設定を編集」をクリックし、読み上げるテキスト、Amazon Lexのボット名やエイリアス名、インテント名を記載して保存します。

右上の三角マークから「名前を付けて保存」を行い、「公開」をクリックしてフロー公開の後、電話番号をフローに割り当てれば、Connectの設定は完了です。

NTT東日本のクラウドエンジニアにてAmazon Connectの導入運用支援を実施しております。サービス資料をダウンロードして、自社の電話業務の改善にお役立てください。

4-5. チャットテスト

構築が完了したので、Amazon Connectのチャットテストでテストをしてみます。

ホーム画面にある「チャットをテスト」をクリックします。

「テスト設定」をクリックし、先ほど作成したフローを選択して、「適用」をクリックします。

チャット画面で「はい」と入力すると、質問内容を問われます。

質問内容として「日本の名物を教えて」と問い合わせした結果が以下になります。

問い合わせ内容に回答されていることを確認出来ました。

NTT東日本のクラウドエンジニアにてAmazon Connectの導入運用支援を実施しております。サービス資料をダウンロードして、自社の電話業務の改善にお役立てください。

5. まとめ

今回は、Amazon ConnectとAmazon BedrockのClaudeを組み合わせて、AI IVRを構築してみました。実際に構築をしてみると、Lambdaの実行時間などの制約もあるので電話での対応よりチャットでの対応の方が使いやすそうです。

このコラムがAmazon ConnectやAmazon Bedrockを利用したことない方の参考になれば幸いです。

NTT東日本では本コラムでご紹介したような技術を活用し、AI IVRソリューションをご提供しております。こちらのページで詳細ご紹介しておりますので是非ご覧ください。

また、AI IVRに関してのご相談窓口もご用意しておりますので、お気軽にお問い合わせください。

ページ上部へ戻る

無料ダウンロード

自社のクラウド導入に必要な知識、ポイントを
このに総まとめ!

あなたはクラウド化の
何の情報を知りたいですか?

  • そもそも自社は本当にクラウド化すべき?オンプレとクラウドの違いは?
  • 【AWS・Azure・Google Cloud】
    どれが自社に最もマッチするの?
  • 情シス担当者の負荷を減らしてコストを軽減するクラウド化のポイントは?
  • 自社のクラウド導入を実現するまでの具体的な流れ・検討する順番は?

初めての自社クラウド導入、
わからないことが多く困ってしまいますよね。

NTT東日本では
そんなあなたにクラウド導入に必要な情報を

1冊の冊子にまとめました!

クラウド化のポイントを知らずに導入を進めると、以下のような事になってしまうことも・・・

  • システムインフラの維持にかかるトータルコストがあまり変わらない。。
  • 情シス担当者の負担が減らない。。
  • セキュリティ性・速度など、クラウド期待する効果を十分に享受できない。。
理想的なクラウド環境を実現するためにも、
最低限の4つのポイントを
抑えておきたいところです。
  • そもそも”クラウド化”とは?
    その本質的なメリット・デメリット
  • 自社にとって
    最適なクラウド環境構築のポイント
  • コストを抑えるため
    具体的なコツ
  • 既存環境からスムーズにクラウド化
    実現するためのロードマップ

など、この1冊だけで自社のクラウド化のポイントが簡単に理解できます。
またNTT東日本でクラウド化を実現し
問題を解決した事例や、
導入サポートサービスも掲載しているので、
ぜひダウンロードして読んでみてください。

クラウドのわからない・
面倒でお困りのあなたへ

クラウドのご相談できます!
無料オンライン相談窓口

NTT東日本なら貴社のクラウド導入設計から
ネットワーク環境構築・セキュリティ・運用まで
”ワンストップ支援”が可能です!

NTT東日本が選ばれる5つの理由

  • クラウド導入を
    0からワンストップでサポート可能!
  • 全体最適におけるコスト効率・業務効率の改善
    中立的にご提案
  • クラウド環境に問題がないか、
    第3者目線でチェック
    してもらいたい
  • 安心の24時間・365日の対応・保守
  • NTT東日本が保有する豊富なサービスの組み合わせで
    ”課題解決”と”コスト軽減”を両立

特に以下に当てはまる方はお気軽に
ご相談ください。

  • さまざまな種類やクラウド提供事業者があってどれが自社に適切かわからない
  • オンプレミスのままがよいのか、クラウド移行すべきなのか、迷っている
  • オンプレミスとクラウド移行した際のコスト比較を行いたい
  • AWSとAzure、どちらのクラウドが自社に適切かわからない
  • クラウド環境に問題がないか、第3者目線でチェックしてもらいたい
  • クラウド利用中、ネットワークの速度が遅くて業務に支障がでている

クラウドを熟知するプロが、クラウド導入におけるお客さまのLAN 環境や接続ネットワーク、
クラウドサービスまでトータルにお客さまのお悩みや課題の解決をサポートします。

相談無料!プロが中立的にアドバイスいたします

クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。